<?php

namespace JsonLowCode\UI;

use JsonLowCode\Schema;
use JsonLowCode\Traits\Events\HasOnUpdateValue;
use JsonLowCode\Traits\Props\HasClosable;
use JsonLowCode\Traits\Props\HasDefaultValue;
use JsonLowCode\Traits\Props\HasDisabled;
use JsonLowCode\Traits\Props\HasModel;
use JsonLowCode\Traits\Props\HasRound;
use JsonLowCode\Traits\Props\HasSize;
use JsonLowCode\Traits\Props\HasType;
use JsonLowCode\Traits\Props\HasValue;
use JsonLowCode\Traits\Slots\HasSlotTrigger;

class DynamicTags extends Schema
{
    protected string $componentName = "NDynamicTags";

    use HasValue, HasModel, HasDefaultValue, HasDisabled, HasClosable, HasType, HasSize, HasRound;
    use HasSlotTrigger;
    use HasOnUpdateValue;

    /**
     * tags 最大数量
     * @param string|int|float $max
     * @return $this
     */
    public function max(string|int|float $max = 100): static
    {
        return $this->prop("max",$max);
    }

    /**
     * 内部 n-input 组件的属性
     * @param string|array|Input $props
     * @return $this
     */
    public function inputProps(string|array|Input $props): static
    {
        if ($props instanceof Input){
            $props = $props->getProps();
        }
        return $this->prop("inputProps",$props);
    }

    /**
     * 自定义输入框的样式
     * @param string|array $style
     * @return $this
     */
    public function inputStyle(string|array $style): static
    {
        return $this->prop("inputStyle",$style);
    }

    /**
     * 自定义标签的样式
     * @param string|array $style
     * @return $this
     */
    public function tagStyle(string|array $style): static
    {
        return $this->prop("tagStyle",$style);
    }


    /**
     * 标签颜色，设置该项后 type 无效
     * @param string|array $value  { color?: string, borderColor?: string, textColor?: string }
     * @return $this
     */
    public function color(string|array $value): static
    {
        return $this->prop("color",$value);
    }


    /**
     * 点击添加按钮时的回调，如果设定则返回值会被用作新添加的初始值。其中 index 是创建内容将要被放置到的位置对应的数组索引，从 1（第二项）开始计算
     * @param string $value ((label: string) => string) | ((label: string) => ({ label: string, value: string }))
     * @return $this
     */
    public function onCreate(string $value = "(label)=>{ return label; }"): static
    {
        return $this->events("onCreate",$value);
    }

    /**
     * 自定义渲染 tag
     * @param Schema $value ((tag: string, index: number) => VNodeChild) | ((tag: { label: string, value: string }, index: number) => VNodeChild)
     * @param array $params
     * @return $this
     */
    public function renderTag(Schema $value, array $params = ["tag","index"]): static
    {
        return $this->slot("renderTag",$value,$params);
    }

    /**
     * 自定义输入元素，由用户填充
     * @param mixed $input 是否是js表达式
     * @param array $params
     * @return $this
     */
    public function slotInput(mixed $input, array $params = []): static
    {
        return $this->slot('input', $input, $params);
    }

}
